package exception;


import util.SpringContextHelper;

/**
 * 
 * JAF Unchecked Exception
 *
 * @author:
 *		唐竹
 * @date 
 *		创建时间：2011-6-3 上午11:08:49 
 *
 */
public class JAFRuntimeException extends RuntimeException implements JAFError {

	private static final long serialVersionUID = -3435955412051301186L;

	/**
	 * errorId对应message.properties中的key
	 */
	private String errorId;

	/**
	 * errorArgs：取代message.propertis中value的{}中的内容
	 */
	private Object[] errorArgs;

	/**
	 * 异常信息，对应message.propertis中的value
	 */
	private String errorMsg;

	/**
	 * 异常信息，用在程序调试用
	 */
	private String debugMsg;

	/**
	 * 
	 * 创建一个新的实例 JAFRuntimeException.   <br/>
	 * 使用该构造器时需要注意，您的程序中并没有Exception抛出，而是由于客户端
	 * 某个操作失误时抛出该异常。
	 *   
	 * @param errorMsg	
	 * 		异常信息，这里没有放在message.propertis中而是由客户端进行管理可以是数据库配置
	 * @param debugMsg
	 * 		异常信息，用在程序调试用
	 */
	public JAFRuntimeException(String errorMsg, String debugMsg) {
		super(debugMsg);
		this.errorMsg = errorMsg;
		this.debugMsg = debugMsg;
	}

	/**
	 * 
	 * 创建一个新的实例 JAFRuntimeException.   <BR>
	 * 		使用该构造器时需要注意，您的程序中并没有Exception抛出，而是由于客户端
	 * 		某个操作失误时抛出该异常。见：{@link com.dzqd.jaf.core.validation.FieldValidateUtils}
	 *   
	 * @param errorId 
	 *      对应message.properties中的key，它和errorArgs共同组成
	 *      在客户端提示信息
	 * @param debugMsg
	 * 		异常信息，用在程序调试用
	 * @param errorArgs
	 *      取代message.propertis中value的{}中的内容
	 */
	public JAFRuntimeException(String errorId, String debugMsg, Object... errorArgs) {
		super(debugMsg);
		this.errorId = errorId;
		this.errorArgs = errorArgs;
		this.debugMsg = debugMsg;
		//获得Error message
		this.getErrorMsg(errorId, errorArgs);
	}

	/**
	 * 
	 * 创建一个新的实例 JAFRuntimeException.   
	 *   
	 * @param errorId 
	 * 		对应message.properties中的key，它和errorArgs共同组成
	 * 		在客户端提示信息
	 * @param cause	
	 * 		异常原因，保持exception chian
	 * @param errorArgs
	 * 		取代message.propertis中value的{}中的内容
	 */
	public JAFRuntimeException(String errorId, Throwable cause, Object... errorArgs) {
		//保存Exception chian
		super(cause);

		this.errorId = errorId;
		this.errorArgs = errorArgs;
		//获得Error message
		this.getErrorMsg(errorId, errorArgs);
	}

	/**
	 * 
	 * 创建一个新的实例 JAFRuntimeException.   
	 *   
	 * @param errorId
	 * 		对应message.properties中的key，它和errorArgs共同组成
	 * 		在客户端提示信息
	 * @param cause
	 * 		异常原因，保持exception chian
	 * @param debugMsg
	 * 		异常信息，用在程序调试用
	 * @param errorArgs
	 * 		取代message.propertis中value的{}中的内容
	 */
	public JAFRuntimeException(String errorId, Throwable cause, String debugMsg, Object... errorArgs) {
		super(debugMsg, cause);
		this.errorId = errorId;
		this.debugMsg = debugMsg;

		//获得Error message
		this.getErrorMsg(errorId, errorArgs);
	}

	/**
	 * 
	 * 	从message.properties中获得异常信息
	 *	@param errorId
	 *	@param errorArgs
	 * 	@throws 
	 * 	@log
	 *		<YYYY-MM-DD			变更者		变更内容>
	 *		2011-6-3			 唐竹			创建
	 */
	private void getErrorMsg(String errorId, Object... errorArgs) {
		/**
		 * errorId key in jaf message properties
		 * the toString() reunt defaule message
		 * errorArgs : format message which in jaf message properties
		 */
		this.errorMsg = SpringContextHelper.getMessage(errorId, errorArgs);
	}

	/**
	 * 在Logging.error时调用toString方法。
	 * 输出结果为：<br/>
	 * 异常类名：errorMsg [客户端提示信息]debugMsg[调试信息]cause by [异常原因]
	 * 
	 */
	@Override
	public String toString() {
		return JAFErrorUtils.toString(this);
	}

	////////////////////////////Getter and Setter////////////////////////////

	public String getErrorId() {
		return errorId;
	}

	public void setErrorId(String errorId) {
		this.errorId = errorId;
	}

	public Object[] getErrorArgs() {
		return errorArgs;
	}

	public void setErrorArgs(Object[] errorArgs) {
		this.errorArgs = errorArgs;
	}

	public String getErrorMsg() {
		return errorMsg;
	}

	public String getDebugMsg() {
		return debugMsg;
	}

	public void setDebugMsg(String debugMsg) {
		this.debugMsg = debugMsg;
	}

}

